package com.ztesoft.web.common;

import java.io.*;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.ztesoft.iocp.cipher.util.RSAUtils;

/**
 * 
 * FTP的工具类<br>
 * 
 * @version 1.0
 */
public final class SeforgeFtpUtils {
	private static Logger logger = LoggerFactory.getLogger(SeforgeFtpUtils.class);
    /**   
     * Description: 向FTP服务器上传文件   
     * @Version1.0   
     * @param url FTP服务器hostname   
     * @param port FTP服务器端口   
     * @param username FTP登录账号   
     * @param password FTP登录密码   
     * @param path FTP服务器保存目录   
     * @param filename 上传到FTP服务器上的文件名   
     * @param input 输入流   
     * @return 成功返回true，否则返回false   
     */    
    public static boolean uploadFile(  
            String url,//FTP服务器hostname   
            int port,//FTP服务器端口  
            String username, // FTP登录账号   
            String password, //FTP登录密码  
            String path, //FTP服务器保存目录  
            String filename, //上传到FTP服务器上的文件名   
            InputStream input // 输入流   
            ) {    
    	boolean success = false;
		FTPClient ftp = new FTPClient();
		try {
			ftp.connect(url, port);//连接FTP服务器
			//如果采用默认端口，可以使用ftp.connect(url)的方式直接连接FTP服务器
			ftp.login(username, RSAUtils.decryptString(password));//登录
			int reply = ftp.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				logger.error("[x] ftp登录失败，账户或密码错误。账户："+username+"，密码："+password);
				ftp.disconnect();
				return success;
			}
			ftp.enterLocalPassiveMode();
			ftp.changeWorkingDirectory(path);//转移到FTP服务器目录
			ftp.storeFile(filename, input);			
			
			input.close();
			ftp.logout();
			success = true;
		} catch (Exception e) {
			logger.error("[x] ftp上传 uploadFile exception info is "+e);
		} finally {
			if (ftp.isConnected()) {
				try {
					ftp.disconnect();
				} catch (IOException ioe) {
					logger.error("[x] io exception info is "+ioe);
				}
			}
		}
		return success;
    }




	/**
	 * Description: 向FTP服务器上传文件
	 * @Version1.0
	 * @param url FTP服务器hostname
	 * @param port FTP服务器端口
	 * @param username FTP登录账号
	 * @param password FTP登录密码
	 * @param path FTP服务器保存目录
	 * @param filename 上传到FTP服务器上的文件名
	 * @param input 输入流
	 * @return 成功返回true，否则返回false
	 */
	public static boolean uploadFileByBinary(
			String url,//FTP服务器hostname
			int port,//FTP服务器端口
			String username, // FTP登录账号
			String password, //FTP登录密码
			String path, //FTP服务器保存目录
			String filename, //上传到FTP服务器上的文件名
			InputStream input // 输入流

	) {
		boolean success = false;
		FTPClient ftp = new FTPClient();
		ByteArrayInputStream bis = null;
		try {
			ftp.connect(url, port);//连接FTP服务器
			//如果采用默认端口，可以使用ftp.connect(url)的方式直接连接FTP服务器
			ftp.login(username, RSAUtils.decryptString(password));//登录
			int reply = ftp.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				logger.error("[x] ftp登录失败，账户或密码错误。账户："+username+"，密码："+password);
				ftp.disconnect();
				return success;
			}
			ftp.enterLocalPassiveMode();
			ftp.setFileType(FTP.BINARY_FILE_TYPE);
			ftp.changeWorkingDirectory(path);//转移到FTP服务器目录
			ftp.storeFile(filename, input);

			input.close();
			ftp.logout();
			success = true;
		} catch (Exception e) {
			logger.error("[x] ftp上传 uploadFile exception info is "+e);
		} finally {
			if (ftp.isConnected()) {
				try {
					ftp.disconnect();
				} catch (IOException ioe) {
					logger.error("[x] io exception info is "+ioe);
				}
			}
		}
		return success;
	}
	/**
     * Description: 从FTP服务器下载文件   
     * @Version1.0   
     * @param url FTP服务器hostname   
     * @param port FTP服务器端口   
     * @param username FTP登录账号   
     * @param password FTP登录密码   
     * @param remotePath FTP服务器上的相对路径   
     * @param fileName 要下载的文件名   
     * @param localPath 下载后保存到本地的路径   
     * @return   
     */    
    public static boolean downFile(  
            String url, //FTP服务器hostname  
            int port,//FTP服务器端口 
            String username, //FTP登录账号 
            String password, //FTP登录密码
            String remotePath,//FTP服务器上的相对路径
            String fileName,//要下载的文件名 
            String localPath//下载后保存到本地的路径
            ) {    
    	boolean success = false;
		FTPClient ftp = new FTPClient();
		try {
			ftp.connect(url, port);//连接FTP服务器
			//如果采用默认端口，可以使用ftp.connect(url)的方式直接连接FTP服务器
			ftp.login(username, RSAUtils.decryptString(password));//登录
			int reply = ftp.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				logger.error("[x] ftp登录失败，账户或密码错误。账户："+username+"，密码："+password);
				ftp.disconnect();
				return success;
			}
			ftp.enterLocalPassiveMode();
			ftp.changeWorkingDirectory(remotePath);//转移到FTP服务器目录
			
			FTPFile[] fs = ftp.listFiles();
			for(FTPFile ff:fs){
				if(ff.getName().equals(fileName)){
					File localFilePath = new File(localPath);
					if(!localFilePath.exists()){//本地创建网元ID的文件夹
						if(localFilePath.mkdir()){
							logger.error("[x] create new folder success, filePath:"+localFilePath);
						}else{
							logger.error("[x] create new folder fail, filePath:"+localFilePath);
						}
					}
					File localFile = new File(localPath+"/"+ff.getName());
					OutputStream is = new FileOutputStream(localFile); 
					ftp.retrieveFile(ff.getName(), is);
					is.close();
					success = true;
					break;
				}
			}
			ftp.logout();
		} catch (Exception e) {
			logger.error("[x] ftp下载  downloadFile exception info is "+e);
		} finally {
			if (ftp.isConnected()) {
				try {
					ftp.disconnect();
				} catch (IOException ioe) {
					logger.error("[x] io exception info is "+ioe);
				}
			}
		}
		return success;
    }



	/**
	 * Description: 从FTP服务器下载文件
	 * @Version1.0
	 * @param url FTP服务器hostname
	 * @param port FTP服务器端口
	 * @param username FTP登录账号
	 * @param password FTP登录密码
	 * @param remotePath FTP服务器上的相对路径
	 * @param fileName 要下载的文件名
	 * @param localPath 下载后保存到本地的路径
	 * @return
	 */
	public static boolean downFileByBinary(
			String url, //FTP服务器hostname
			int port,//FTP服务器端口
			String username, //FTP登录账号
			String password, //FTP登录密码
			String remotePath,//FTP服务器上的相对路径
			String fileName,//要下载的文件名
			String localPath//下载后保存到本地的路径
	) {
		boolean success = false;
		FTPClient ftp = new FTPClient();
		try {
			ftp.connect(url, port);//连接FTP服务器
			//如果采用默认端口，可以使用ftp.connect(url)的方式直接连接FTP服务器
			ftp.login(username, RSAUtils.decryptString(password));//登录
			int reply = ftp.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				logger.error("[x] ftp登录失败，账户或密码错误。账户："+username+"，密码："+password);
				ftp.disconnect();
				return success;
			}
			ftp.enterLocalPassiveMode();
			ftp.setFileType(FTP.BINARY_FILE_TYPE);
			ftp.changeWorkingDirectory(remotePath);//转移到FTP服务器目录

			FTPFile[] fs = ftp.listFiles();
			for(FTPFile ff:fs){
				if(ff.getName().equals(fileName)){
					File localFilePath = new File(localPath);
					if(!localFilePath.exists()){//本地创建网元ID的文件夹
						if(localFilePath.mkdir()){
							logger.error("[x] create new folder success, filePath:"+localFilePath);
						}else{
							logger.error("[x] create new folder fail, filePath:"+localFilePath);
						}
					}
					File localFile = new File(localPath+"/"+ff.getName());
					OutputStream is = new FileOutputStream(localFile);
					ftp.retrieveFile(ff.getName(), is);
					is.close();
					success = true;
					break;
				}
			}
			ftp.logout();
		} catch (Exception e) {
			logger.error("[x] ftp下载  downloadFile exception info is "+e);
		} finally {
			if (ftp.isConnected()) {
				try {
					ftp.disconnect();
				} catch (IOException ioe) {
					logger.error("[x] io exception info is "+ioe);
				}
			}
		}
		return success;
	}

	public static void main(String[] args) {
    	//downFile("10.45.44.148", 21, "informix", "informix", "/informix/hgyy/", "75561525020160802145955.tar.gz", "D:/");
    	//File tempFile= new File("D://"+"75561525020160802145955.tar.gz");
		FileInputStream in;
		try {
			in = new FileInputStream(new File("D:/"+"/"+"75561525020160802162156.tar.gz"));
			uploadFile("10.45.44.148", 21, "informix", "informix", "/informix/hgy_back/","75561525020160802145955.tar.gz", in);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

